54

     # datetime - примеры применения

Импорт библиотеки

import datetime
print(f"now: {datetime.datetime.now()}")
# now: 2024-03-05 21:32:59.492866

from datetime import datetime
print(f"now: {datetime.now()}")
now: 2024-03-05 21:32:59.492866

Методы библиотеки

Получить текущую дату и время

from datetime import datetime
print(f"now: {datetime.now()}")
now: 2024-03-05 21:32:59.492866

print(f"today: {datetime.today()}")
today: 2024-03-05 21:32:59.492866

Подставить свои значения

print(f"now: {datetime.today().replace(year=2022, month=2, day=5)}")
now: 2022-02-05 21:43:51.635193

print(f"now: {datetime.today().replace(year=2034)}")
now: 2034-03-05 21:44:59.627618

Получить день недели

print(f"now: {datetime.today().weekday()}")
  • 0 - понедельник
  • 7 - воскресенье

Преобразовать формат возвращаемой даты

print(f'now: {datetime.now().strftime("%Y-%m-%d_%H:%M:%S")}')
now: 2024-03-05_21:51:43

print(f'now: {datetime.now().strftime("Год: %Y Месяц %m Число: %d Время: %H:%M:%S")}')
now: Год: 2024 Месяц 03 Число: 05 Время: 21:52:45

print(f'now: {datetime.now().strftime("%y%M Число: %d Время: %H:%M:%s")}')
now: Год: 2024 Месяц 03 Число: 05 Время: 21:52:1709664773

print(f'now: {datetime.now().strftime("%y.%m.%d")}')
now: 24.03.05

Также можно обрезать значение с помощью срезов строк:

# получить первые 5 символов
print(f'{str(datetime.now().strftime("%Y-%m-%d_%H:%M:%S"))[-8:]}')

# получить последние 8 символов
print(f'{str(datetime.now().strftime("%Y-%m-%d_%H:%M:%S"))[-8:]}')
21:58:24

print(f'{str(datetime.now().strftime("Год: %Y-%m-%d_%H:%M:%S"))[:15].replace("2024", "2032")}')
Год: 2032-03-05

Прочие сценарии

Получить объект datetime из posix

print(datetime.fromtimestamp(0))
1970-01-01 03:00:00

print(datetime.fromtimestamp(995789256))
2001-07-22 12:07:36

import time
my_dt_obj = datetime.fromtimestamp(time.time())
print(my_dt_obj)
print(type(my_dt_obj))

2024-03-05 22:13:57.985201
<class 'datetime.datetime'>

Получить объект datetime из стринги

Для этого передаём текст и указываем шаблон, по которому можно распарсить дату:

my_txt_date = "25|02|24"
my_dt_obj = datetime.strptime(my_txt_date, "%y|%m|%d")
print(my_dt_obj)
print(type(my_dt_obj))

2025-02-24 00:00:00
<class 'datetime.datetime'>

Если же не соблюдать форматирование исходного текста:

my_txt_date = "25|02|24"
my_dt_obj = datetime.strptime(my_txt_date, "%y-%m-%d")
Traceback (most recent call last):
ValueError: time data '25|02|24' does not match format '%y-%m-%d'

То есть, шаблон используемый для преобразования в объект datetime должен соответствовать передаваемому тексту.

Получить дату и время через datetime

Не путать объекты:

  • datetime.time
  • datetime.date
  • datetime.datetime

Создать дату можно "напрямую" через функцию date. Но нужно учитывать, что в таком случае импорт нужно делать следующим образом:

import datetime

my_date=datetime.date(2027, 2, 23)
print(f"my_date: {my_date}")
print(f"type: {type(my_date)}")

my_date: 2027-02-23
type: <class 'datetime.date'>

Объект, получаемый таким способом будеть иметь тип <class 'datetime.date'> (а не <class 'datetime.datetime'>).

То же самое касается и времени:

my_date = datetime.time(12, 7, 24)
print(my_date)

12:07:24
type: <class 'datetime.time'>

Получение даты последнего изменения файла

Дата последнего изменения файла на уровне OS получаем через:

import os
my_file_date = os.path.getmtime(my_file)

this_file_date = datetime.fromtimestamp(my_file_date)

fromtimestamp используется для преобразования даты из POSIX.

timedelta - сравнение дат

from datetime import datetime, timedelta
now = datetime.now()
one_day_period = timedelta(days=1)

yesterday = now - one_day_period

print(f"now: {now}")
print(f"one_day_period: {one_day_period}")
print(f"type(one_day_period): {type(one_day_period)}")
print(f"yesterday: {yesterday}")

now: 2024-03-05 23:04:02.703509
one_day_period: 1 day, 0:00:00
type(one_day_period): <class 'datetime.timedelta'>
yesterday: 2024-03-04 23:04:02.703509

Как видим, один день "убавился". Класс timedelta поддерживает следующие параметры:

  • days
  • seconds
  • microseconds
  • milliseconds
  • minutes
  • hours
  • weeks

Тем самым с помощью timedelta мы можем формировать новые даты:

now = datetime.now()
next_week = now + timedelta(weeks=1)

Также этот метод удобно использовать в сравнениях:

time_now = datetime.now()
end_time = time_now + datetime.timedelta(seconds=50)

if time_now >= end_time:
    do_something...